package cn.iocoder.yudao.module.system.service.datasource;

import cn.iocoder.yudao.framework.datasource.core.ChangeDataSourceService;
import cn.iocoder.yudao.framework.datasource.core.DataSourceConfigDO;
import cn.iocoder.yudao.framework.datasource.core.DataSourceContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * 动态数据源测试服务
 * 提供数据源切换测试功能
 *
 * @author 芋道源码
 */
@Service
@Slf4j
public class DynamicDataSourceTestService {

    @Autowired(required = false)
    private ChangeDataSourceService changeDataSourceService;

    @Autowired(required = false)
    private JdbcTemplate jdbcTemplate;

    /**
     * 测试动态切换数据源并执行查询
     *
     * @param dataSourceConfig 数据源配置
     * @param sql 测试SQL
     * @return 查询结果
     */
    public String testDataSourceSwitch(DataSourceConfigDO dataSourceConfig, String sql) {
        if (changeDataSourceService == null) {
            return "数据源切换服务未初始化";
        }

        if (jdbcTemplate == null) {
            return "JdbcTemplate 未初始化";
        }

        try {
            // 获取当前数据源
            String originalDataSource = DataSourceContextHolder.getDataSource();
            log.info("当前数据源: {}", originalDataSource);

            // 切换到新数据源
            changeDataSourceService.changeDS(dataSourceConfig);
            String currentDataSource = DataSourceContextHolder.getDataSource();
            log.info("切换后数据源: {}", currentDataSource);

            // 执行测试查询
            List<Map<String, Object>> results = jdbcTemplate.queryForList(sql);
            log.info("查询结果: {}", results);

            // 恢复原数据源
            if (originalDataSource != null) {
                DataSourceContextHolder.setDataSource(originalDataSource);
            } else {
                changeDataSourceService.restoreDefaultDS();
            }

            return "测试成功，查询到 " + results.size() + " 条记录: " + results.toString();

        } catch (Exception e) {
            log.error("数据源切换测试失败", e);
            // 确保恢复到默认数据源
            changeDataSourceService.restoreDefaultDS();
            return "测试失败: " + e.getMessage();
        }
    }

    /**
     * 测试当前数据源连接
     *
     * @return 测试结果
     */
    public String testCurrentDataSource() {
        if (jdbcTemplate == null) {
            return "JdbcTemplate 未初始化";
        }

        try {
            String currentDataSource = DataSourceContextHolder.getDataSource();
            log.info("当前数据源: {}", currentDataSource);

            // 执行简单查询测试连接
            jdbcTemplate.queryForObject("SELECT 1", Integer.class);

            return "当前数据源连接正常: " + (currentDataSource == null ? "默认数据源" : currentDataSource);

        } catch (Exception e) {
            log.error("数据源连接测试失败", e);
            return "数据源连接失败: " + e.getMessage();
        }
    }

    /**
     * 创建示例数据源配置用于测试
     *
     * @return 示例配置
     */
    public DataSourceConfigDO createTestDataSourceConfig() {
        return new DataSourceConfigDO(
                "test-datasource",
                "jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true",
                "root",
                "123456",
                "MYSQL"
        );
    }
}